/* 
类型别名: 
  给特定的值或类型通过 type 来指定其别名, 后面通过别名来代表这个值或类型
  类型别名并没有定义新的类型, 而只是为了方便使用取的友好名称
*/
(() => {

  // 1. 数据别名

  // 给特定数据值取别名(一般为多个值的联合类型值)
  // 那么这个别名类型的变量就只是能是其中某一个值
  type Status = 0 | 1 | 3
  
  let status: Status = 0
  status = 1
  status = 3
  // status = 2 // error

  type ActionType = 'INCREMENT' | 'DECREMENT' 
  let type: ActionType = 'INCREMENT'
  type = 'DECREMENT'
  // type = 'abc' // error

  // 2. 类型别名
  // 类型别名并没有定义新的类型, 而只是为了方便使用取的友好名称
  let name: string = 'tom'
  type Name = string | number | object
  let name2: Name = 'Jack'
  name2 = 3
  // name2 = false  // error

  interface Person {
    name: string
    age: number
  }

  let persons: Person[]

  type PersonList = Person[]

  let persons2: PersonList


  // 一个接口创建了一个新的类型, 但别名类型并没有
  // 一个类也创建了一个新的类型

  type Test = 2 | string
  let a: Test = 2
  // a = 3 // error
  a = 'atguigu'

})()